#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const double EPS = 1e-15;
const double PI = acos(-1.0);
const double INF = 1e12;

struct node{
    double dis;
    int idx;
    node(double dis = 0, int idx=0) : dis(dis), idx(idx) {}
    bool operator<(const node& o)const{
        return dis<o.dis;
    }
};


// 符号函数
int sign(double x) { return x < -EPS ? -1 : x > EPS; }

// 点/向量类
struct Point {
    double x, y;
    Point(double x = 0, double y = 0) : x(x), y(y) {}
    
    // 向量加法
    Point operator+(const Point& p) const { return Point(x+p.x, y+p.y); }
    // 向量减法
    Point operator-(const Point& p) const { return Point(x-p.x, y-p.y); }
    // 标量乘法
    Point operator*(double k) const { return Point(x*k, y*k); }
    // 标量除法
    Point operator/(double k) const { return Point(x/k, y/k); }
    // 等于运算符
    bool operator==(const Point& p) const { return sign(x-p.x) == 0 && sign(y-p.y) == 0; }
    // 不等于运算符
    bool operator!=(const Point& p) const { return !(*this == p); }
    
    // 点积
    double dot(const Point& p) const { return x*p.x + y*p.y; }
    // 叉积
    double cross(const Point& p) const { return x*p.y - y*p.x; }
    // 模长平方
    double norm2() const { return x*x + y*y; }
    // 模长
    double norm() const { return sqrt(norm2()); }
    // 单位向量
    Point unit() const { return *this / norm(); }
};

// 线段类
struct Segment {
    Point p1, p2;
    Segment(Point p1 = Point(), Point p2 = Point()) : p1(p1), p2(p2) {}
    Point line_intersection_force(const Segment& L) {
        Point a = p1, b = p2;
        Point c = L.p1, d = L.p2;
        
        Point ab = b - a;
        Point cd = d - c;
        double t = (c - a).cross(cd) / ab.cross(cd);
        return a + ab * t;
    }
};

//点到直线的距离
double distance_point_line(Point p, const Segment& L) {
    Point a = L.p1, b = L.p2;
    // 处理直线退化为点的情况
    if (a == b) return (p - a).norm();
    
    Point ab = b - a;  // 直线方向向量
    Point ap = p - a;  // 从a到p的向量
    
    // 面积法：|ap × ab| / |ab|
    return abs(ap.cross(ab)) / ab.norm();
}


void solve(){
    int n;
    cin>>n;
    vector<Point> p;
    for(int i=0;i<n;i++){
        int x,y;
        cin>>x>>y;
        p.push_back({(double)x,(double)y});
    }
    Point p1={-1e6,1e6};
    Point p2={0,0};
    Point p4={1e6,1e6};

    Segment l1(p1,p2);
    Segment l2(p2,p4);

    vector<node> ps;
    for(int i=0;i<n;i++){
        double dis=(p[i].x+1e6)+(p[i].y+1e6);
        ps.push_back({dis,i+1});
    }
    // for(int i=0;i<n;i++){
    //     cout<<ps[i].dis<<' '<<ps[n-i-1].idx<<'\n';
    // }
    sort(ps.begin(),ps.end());
    for(int i=0;i<n/2;i++){
        cout<<ps[i].idx<<' '<<ps[n-i-1].idx<<'\n';
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t=1;
    cin>>t;
    while(t--){
        solve();
    }
}